/**
 * 封装axios
 */
import axios from 'axios'

// 导入vuex实例
import store from '@/store'
// 导入router实例
import router from '@/router'
// 导入饿了么消息提示方法
import { Message } from 'element-ui'
// 1. 创建axios新实例（发请求）
const baseURL = 'http://big-event-vue-api-t.itheima.net'
const request = axios.create({
  // 配置后台基础地址
  // baseURL: 'http://big-event-vue-api-t.itheima.net'
  baseURL
})
// 添加请求拦截器=>请求发送前执行
// request.interceptors.request.use((config) => {
//   // config 请求配置
//   // 场景：发送请求之前，统一添加请求头header
//   console.log('请求配置：', config)
//   if (config.url.startsWith('/my')) {
//     // 以/my开头的请求，添加header
//     // store === 等价于 this.$store
//     config.headers.Authorization = store.state.user.token
//   }
//   return config
// })

// 1. 添加请求拦截器=》发送请求之前执行（请求没发呢）
/**
  * config 请求的配置对象（包含当前请求所有信息）
  */
request.interceptors.request.use(function (config) {
  // console.log('1.开始发请求了')
  // 在发送请求之前做些什么?
  // == 场景：判断给需要添加header参数值的接口，添加token ==
  // 需求❓：接口请求url以：/my 开头，都需要添加header参数
  if (config.url.startsWith('/my')) {
    // 给header添加属性名和值
    // 怎么在.js文件中获取vuex数据=》导入vuex模块实例
    // == store === 等价于 在组件中使用this.$store ==
    config.headers.Authorization = store.state.user.token
  }
  // 返回咱们请求配置，发送请求
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 2. 添加响应拦截器=》发送请求之后执行
request.interceptors.response.use(function (response) {
  // == 2xx 范围内的状态码都会触发该函数。 ==
  // 对响应数据做点什么
  // console.log('2. 请求成功了', response)
  return response
}, function (error) {
  // == 超出 2xx 范围的状态码都会触发该函数。==
  // 对响应错误做点什么
  // 需求❓：在token失效情况下，接口请求401了，跳回登录页重新登录
  // 说明：== 只处理401情况 ==
  console.log('3. 请求失败了')
  console.log(error)
  // 解决：多个接口请求401重复跳转登录页
  if (error.response.status === 401) {
    // 判断如果已经跳回登录页了，后边代码没必要执行了
    // 使用router实例：router.currentRoute.path 获取当前访问页面的地址
    if (router.currentRoute.path === '/login') return
    console.log('====只重新跳转一次=====')
    /**
      * 1. 删除token =》怎么删除vuex存的token？=》导入vuex实例
      * 2. 跳回登录页=> js怎么跳页面？=》导入router实例
      * 添加token失效的消息提示？导入Message方法
      */
    Message.error('token失效了,请重新登陆！')
    store.commit('user/delToken')
    router.replace('/login')
  }

  return Promise.reject(error)
})

// 2.导出发请求的新axios
export default request
// 导出地址
export { baseURL }
